package com.zkh.myutils.database.dbpool;

import java.util.HashMap;
import java.util.Map;
import com.zkh.myutils.utils.StringUtils;

/**
 * 数据库类型
 * @author zkh
 */
public class DBType {
	/**
	 * MySQL数据库
	 */
	public static final DBType TYPE_MYSQL = new DBType("mysql");
	/**
	 * SQLSERVER数据库
	 */
	public static final DBType TYPE_SQLSERVER = new DBType("sqlserver");
	/**
	 * ORACLE数据库
	 */
	public static final DBType TYPE_ORACLE = new DBType("oracle");
	/**
	 * 空类型
	 */
	private static final DBType TYPE_NULL = new DBType("null");
	/**
	 * 数据库类型缓存
	 */
	private static final Map<String, DBType> cacheMap = new HashMap<>();
	
	/**
	 * 数据库类型。同一数据库，类型需保持一致，这将作为是否加载过驱动的标识
	 */
	private String dbType;
	
	/**
	 * 构造方法
	 * @param dbType 数据库类型。
	 * <b>注意，同一数据库，类型请保持一致，这将作为是否加载过驱动的标识</b>
	 */
	private DBType(String dbType) {
		//保存值
		this.dbType = dbType;
	}
	
	/**
	 * 获取数据库类型
	 * @param dbType 数据库类型。
	 * <b>注意，同一数据库，类型请保持一致，这将作为是否加载过驱动的标识</b>
	 */
	public synchronized static DBType getDbType(String dbType) {
		//空
		if(StringUtils.isEmpty(dbType)) {
			return TYPE_NULL;
		}
		//获取缓存
		DBType type = cacheMap.get(dbType = dbType.toLowerCase());
		//不存在，创建
		if(type==null) {
			//判断类型
			switch (dbType) {
				//MySQL
				case "mysql":
					//创建并缓存对象
					cacheMap.put(dbType, type = TYPE_MYSQL);break;
				//SQLServer
				case "sqlserver":
					//创建并缓存对象
					cacheMap.put(dbType, type = TYPE_SQLSERVER);break;
				//ORACLE
				case "oracle":
					//创建并缓存对象
					cacheMap.put(dbType, type =TYPE_ORACLE);break;
				//其它类型
				default:
					//创建并缓存对象
					cacheMap.put(dbType, type = new DBType(dbType));break;
			}
		}
		//返回类型
		return type;
	}

	public String getDbType() {
		return dbType;
	}

	public void setDbType(String dbType) {
		this.dbType = dbType;
	}
}
